import json
import os
import utils
from PIL import Image, ImageDraw, ImageFont
import config


#-------- 只需要配置这里 - 开始--------------------
# 自定义标识，匹配json文件：json/export_logs_{tag}.json
tag = config.tag #"audio"
# 导出日志可能存在多种类型，你可以设置只处理某一类
webhook_list = config.webhook_list #['audio_create','video_create'] # 支持处理的类型： ['news_create','album_create','audio_create','video_create']
# 在 DiyCMS -> 项目管理 -> API管理 -> Service Token
# 用来生成小程序码的，项目要绑定了小程序才可以
service_token = config.service_token #"Bearer eyJ0eXAiOiJK********换成你自己的********4_uKPe8"
# 贴纸是否有边框-打印测试时开启，方便观察打印位置  True 开启  False 关闭
is_border = config.is_border #False
#-------- 只需要配置这里 - 结束--------------------


json_file= f"json/export_logs_{tag}.json"


# 下载图片目录
down_icons = f'images/icons/{tag}'
# 创建保存目录（可选）
os.makedirs(down_icons, exist_ok=True)

# 生成图片目录 
tiezhi_images = f'images/tiezhi/{tag}'
# 创建保存目录（可选）
os.makedirs(tiezhi_images, exist_ok=True)


# 生成小程序码 图片目录 
qr_images = f'images/qrcode/{tag}'
# 创建保存目录（可选）
os.makedirs(qr_images, exist_ok=True)


# 设置字体路径 - 请根据您的系统调整
font_title = ImageFont.truetype("font/Alibaba-PuHuiTi-Regular.ttf", 40)
font_chinese = ImageFont.truetype("font/Alibaba-PuHuiTi-Regular.ttf", 26)
font_pronunciation = ImageFont.truetype("font/arial.ttf", 26)
font_sentence = ImageFont.truetype("font/arial.ttf", 24)
font_sentence_big = ImageFont.truetype("font/arial.ttf", 26)
font_sentence_small = ImageFont.truetype("font/arial.ttf", 22)
font_sentence_mini = ImageFont.truetype("font/arial.ttf", 18)
font_translation = ImageFont.truetype("font/Alibaba-PuHuiTi-Regular.ttf", 24)



# 加载JSON数据
with open(json_file, 'r', encoding='utf-8') as file:
    data_list = json.load(file)


# 初始化统计
total = len(data_list)
success_count = 0
failed_list = []  # 存储失败的文件信息

# 为每个条目生成图片
for index, data in enumerate(data_list):
    
    if data['logs']['type'] !='json':
        continue
    if data['status'] !=1:
        continue
    
    # webhook: 
    if data['webhook'] not in webhook_list:
        continue

    # 处理 json数据
    data_log = json.loads(data['logs']['log'])
      # 会将每个单词的首字母都转为大写
    data_log['title'] = data_log['title'].title()
    
    
    # 下载生成的图标 image_link => down_icons
    icon_file = f"{down_icons}/{data_log['title']}.png"
    # 存在则不重复下载
    if not os.path.exists(icon_file):
        print("图标不存在，开始下载")
        success = utils.download_image(data_log['image_link'], icon_file)
        if not success:
            print("❌ 下载图标失败，请检查网络或URL地址。")
            failed_list.append({"title": data_log['title'], "error": "下载图标失败"})
            continue

    # 生成小程序码
    qr_file = f"{qr_images}/{data_log['title']}.jpg"
    # 存在则不重复下载
    if not os.path.exists(qr_file):
        print("小程序码不存在，开始生成")
        success = utils.wxacode_create_bytes(service_token,data['webhook'], data['data_id'],qr_file)
        if not success:
            print("❌ 生成小程序码失败，请检查网络或URL地址。")
            failed_list.append({"title": data_log['title'], "error": "生成小程序码失败"})
            continue
    
    
  

    # 创建一个RGB图像，背景为白色
    if not is_border:
        background = Image.new('RGBA', (428, 349), '#ffffff')
    else:
        # 边框背景图，用于打印测试
        # 创建一个RGB图像，背景为白色
        background = Image.new('RGBA', (428, 349), '#ff0000')
        # 合并背景 形成边框
        background2 = Image.new('RGBA', (424, 345), '#ffffff')
        background.paste(background2, (2,2), background2)
    
     # 小程序码
    img_qr = Image.open(qr_file).convert("RGBA").resize((214, 214))
    # 图标
    img_icon = utils.resize_and_pad_image(icon_file,output_size=(180, 180))
    # 合并背景图片和 小程序码
    background.paste(img_qr, (background.width - img_qr.width - 10, 10), img_qr)
    # 合并背景图片和 图标  background.width - imgimg_icon_qr.width - 
    background.paste(img_icon, (10, 10), img_icon)
    
    
    
    # 添加文字
    draw = ImageDraw.Draw(background)

    draw.text((15, 190), data_log['title'], font=font_title, fill=(255, 0, 0))
    draw.text((15, 240), data_log['pronunciation'], font=font_pronunciation, fill=(0, 0, 0))
    # 字符多的就调小字体大小
    if len(data_log['sentence']) <34:
        draw.text((15, 278), data_log['sentence'], font=font_sentence_big, fill=(0, 0, 0))
    elif len(data_log['sentence']) >=42:
        draw.text((15, 278), data_log['sentence'], font=font_sentence_mini, fill=(0, 0, 0))
    elif len(data_log['sentence']) >=38:
        draw.text((15, 278), data_log['sentence'], font=font_sentence_small, fill=(0, 0, 0))
    else:
        draw.text((15, 278), data_log['sentence'], font=font_sentence, fill=(0, 0, 0))
        
    draw.text((15, 305), data_log['translation'], font=font_translation, fill=(0, 0, 0))

    # 音标太长，调节文字位置
    c_x = img_qr.width*0.8
    if len(data_log['pronunciation']) >17:
        c_x = img_qr.width*0.6
    
    draw.text((background.width - c_x - 10, 235), data_log['chinese'], font=font_chinese, fill=(0, 0, 0))

    # 生成贴纸图片
    # 保存最终图片，空格换成 _
    filename = f"{tiezhi_images}/{data_log['title'].replace(' ', '_')}.png"
    background.save(filename)
    # print(f"✅ 生成成功: {filename}")
    
    success_count += 1

    
# === 下载完成，输出总结 ===
print("\n" + "="*50)
print(f"✅ 下载任务完成！保存在：{tiezhi_images}")
print(f"📊 总共: {total} 个文件")
print(f"🟢 成功: {success_count} 个")
print(f"🔴 失败: {len(failed_list)} 个")

if failed_list:
    print("\n📝 失败详情:")
    for fail in failed_list:
        print(f"  • {fail['title']} - {fail['error']}")

print("="*50)
